package com.example; // 定义包名为com.example

import com.example.dao.UserDao; // 导入UserDao接口
import com.example.dao.impl.UserDaoJdbcImpl; // 导入UserDao的JDBC实现类
import com.example.model.User; // 导入User实体类
import com.example.service.UserService; // 导入UserService业务逻辑类

import java.util.List; // 导入List集合类
import java.util.Scanner; // 导入Scanner输入类

/**
 * 用户系统主程序
 * 演示用户注册、登录、查询等功能
 */
public class Main { // 定义Main主类
    
    private static UserService userService; // 声明静态的用户服务对象
    private static Scanner scanner; // 声明静态的输入扫描器对象
    
    public static void main(String[] args) { // 程序入口方法
        // 初始化
        UserDao userDao = new UserDaoJdbcImpl(); // 创建UserDao的JDBC实现实例
        userService = new UserService(userDao); // 创建UserService实例并注入UserDao依赖
        scanner = new Scanner(System.in); // 创建Scanner实例用于读取用户输入
        
        System.out.println("=== 欢迎使用用户管理系统 ==="); // 输出欢迎信息
        System.out.println("请确保MySQL数据库已启动，并执行了init.sql脚本"); // 输出数据库准备提示
        
        // 主菜单循环
        while (true) { // 无限循环显示主菜单
            showMenu(); // 调用显示菜单方法
            int choice = getChoice(); // 获取用户选择
            
            switch (choice) { // 根据用户选择执行相应操作
                case 1: // 用户选择注册
                    registerUser(); // 调用用户注册方法
                    break; // 跳出switch语句
                case 2: // 用户选择登录
                    loginUser(); // 调用用户登录方法
                    break; // 跳出switch语句
                case 3: // 用户选择查找用户
                    findUser(); // 调用查找用户方法
                    break; // 跳出switch语句
                case 4: // 用户选择显示所有用户
                    listAllUsers(); // 调用显示所有用户方法
                    break; // 跳出switch语句
                case 5: // 用户选择退出
                    System.out.println("感谢使用，再见！"); // 输出退出信息
                    return; // 退出main方法，结束程序
                default: // 用户输入无效选择
                    System.out.println("无效选择，请重新输入"); // 输出错误提示
            } // switch语句结束
            
            System.out.println(); // 空行分隔
        } // while循环结束
    } // main方法结束
    
    private static void showMenu() { // 显示主菜单的方法
        System.out.println("\n=== 主菜单 ==="); // 输出主菜单标题
        System.out.println("1. 用户注册"); // 输出选项1：用户注册
        System.out.println("2. 用户登录"); // 输出选项2：用户登录
        System.out.println("3. 查找用户"); // 输出选项3：查找用户
        System.out.println("4. 显示所有用户"); // 输出选项4：显示所有用户
        System.out.println("5. 退出系统"); // 输出选项5：退出系统
        System.out.print("请选择操作 (1-5): "); // 输出选择提示
    } // showMenu方法结束
    
    private static int getChoice() { // 获取用户选择的方法
        try { // 尝试解析用户输入
            return Integer.parseInt(scanner.nextLine()); // 读取用户输入并转换为整数
        } catch (NumberFormatException e) { // 捕获数字格式异常
            return -1; // 返回-1表示输入无效
        } // try-catch语句结束
    } // getChoice方法结束
    
    private static void registerUser() { // 用户注册功能方法
        System.out.println("\n=== 用户注册 ==="); // 输出注册功能标题
        
        System.out.print("请输入用户名: "); // 提示输入用户名
        String username = scanner.nextLine(); // 读取用户输入的用户名
        
        System.out.print("请输入密码: "); // 提示输入密码
        String password = scanner.nextLine(); // 读取用户输入的密码
        
        System.out.print("请输入邮箱: "); // 提示输入邮箱
        String email = scanner.nextLine(); // 读取用户输入的邮箱
        
        try { // 尝试执行注册操作
            boolean success = userService.register(username, password, email); // 调用用户服务的注册方法
            if (success) { // 如果注册成功
                System.out.println("✓ 注册成功！"); // 输出成功信息
            } else { // 如果注册失败
                System.out.println("✗ 注册失败，用户名可能已存在"); // 输出失败信息
            } // if-else语句结束
        } catch (IllegalArgumentException e) { // 捕获参数异常
            System.out.println("✗ 注册失败: " + e.getMessage()); // 输出参数错误信息
        } catch (Exception e) { // 捕获其他异常
            System.out.println("✗ 注册失败: " + e.getMessage()); // 输出通用错误信息
        } // try-catch语句结束
    } // registerUser方法结束
    
    private static void loginUser() { // 用户登录功能方法
        System.out.println("\n=== 用户登录 ==="); // 输出登录功能标题
        
        System.out.print("请输入用户名: "); // 提示输入用户名
        String username = scanner.nextLine(); // 读取用户输入的用户名
        
        System.out.print("请输入密码: "); // 提示输入密码
        String password = scanner.nextLine(); // 读取用户输入的密码
        
        try { // 尝试执行登录操作
            boolean success = userService.login(username, password); // 调用用户服务的登录方法
            if (success) { // 如果登录成功
                System.out.println("✓ 登录成功！欢迎, " + username); // 输出登录成功信息
                
                // 显示用户信息
                User user = userService.findUserByUsername(username); // 根据用户名查找用户信息
                if (user != null) { // 如果找到用户信息
                    System.out.println("用户信息:"); // 输出用户信息标题
                    System.out.println("  ID: " + user.getId()); // 输出用户ID
                    System.out.println("  用户名: " + user.getUsername()); // 输出用户名
                    System.out.println("  邮箱: " + user.getEmail()); // 输出用户邮箱
                } // if语句结束
            } else { // 如果登录失败
                System.out.println("✗ 登录失败，用户名或密码错误"); // 输出登录失败信息
            } // if-else语句结束
        } catch (Exception e) { // 捕获异常
            System.out.println("✗ 登录失败: " + e.getMessage()); // 输出异常错误信息
        } // try-catch语句结束
    } // loginUser方法结束
    
    private static void findUser() { // 查找用户功能方法
        System.out.println("\n=== 查找用户 ==="); // 输出查找用户功能标题
        
        System.out.print("请输入要查找的用户名: "); // 提示输入要查找的用户名
        String username = scanner.nextLine(); // 读取用户输入的用户名
        
        try { // 尝试执行查找操作
            User user = userService.findUserByUsername(username); // 调用用户服务的查找用户方法
            if (user != null) { // 如果找到用户
                System.out.println("✓ 找到用户:"); // 输出找到用户信息
                System.out.println("  ID: " + user.getId()); // 输出用户ID
                System.out.println("  用户名: " + user.getUsername()); // 输出用户名
                System.out.println("  邮箱: " + user.getEmail()); // 输出用户邮箱
            } else { // 如果未找到用户
                System.out.println("✗ 未找到用户: " + username); // 输出未找到用户信息
            } // if-else语句结束
        } catch (Exception e) { // 捕获异常
            System.out.println("✗ 查找失败: " + e.getMessage()); // 输出异常错误信息
        } // try-catch语句结束
    } // findUser方法结束
    
    private static void listAllUsers() { // 显示所有用户列表功能方法
        System.out.println("\n=== 所有用户列表 ==="); // 输出用户列表功能标题
        
        try { // 尝试执行获取用户列表操作
            List<User> users = userService.getAllUsers(); // 调用用户服务的获取所有用户方法
            if (users.isEmpty()) { // 如果用户列表为空
                System.out.println("暂无用户数据"); // 输出无用户数据信息
            } else { // 如果用户列表不为空
                System.out.printf("%-5s %-15s %-25s%n", "ID", "用户名", "邮箱"); // 输出表格标题行
                System.out.println("─".repeat(50)); // 输出分隔线
                for (User user : users) { // 遍历用户列表
                    System.out.printf("%-5d %-15s %-25s%n", // 格式化输出用户信息
                        user.getId(), // 输出用户ID
                        user.getUsername(), // 输出用户名
                        user.getEmail()); // 输出用户邮箱
                } // for循环结束
                System.out.println("\n共找到 " + users.size() + " 个用户"); // 输出用户总数
            } // if-else语句结束
        } catch (Exception e) { // 捕获异常
            System.out.println("✗ 获取用户列表失败: " + e.getMessage()); // 输出异常错误信息
        } // try-catch语句结束
    } // listAllUsers方法结束
} // Main类结束